package lbframework.classe;

import com.sun.mail.util.MailSSLSocketFactory;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.print.PrinterJob;
import org.w3c.tools.codec.Base64Decoder;
import org.w3c.tools.codec.Base64Encoder;
import java.io.File;
import java.math.BigInteger;
import java.net.InetAddress;
import java.security.MessageDigest;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.Vector;
import lbframework.bean.comboBox.LBComboBox;
import lbframework.bean.consultaCampo.LBConsultaCampo;
import lbframework.bean.textField.LBTextField;
import lbframework.remote.ItemComboVO;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.swing.BorderFactory;
import javax.swing.border.Border;
//import org.w3c.tools.codec.Base64Decoder;
//import org.w3c.tools.codec.Base64Encoder;
import lbframework.bean.calendar.LBCalendar;
import lbframework.bean.fileChooser.LBFileChooser;
import lbframework.bean.passwordField.LBPasswordField;
import lbframework.bean.textArea.LBTextArea;
import lbframework.bean.textAreaEx.LBTextAreaEx;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Set;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import sun.jvmstat.monitor.HostIdentifier;
import sun.jvmstat.monitor.MonitoredHost;
import sun.jvmstat.monitor.MonitoredVm;
import sun.jvmstat.monitor.MonitoredVmUtil;
import sun.jvmstat.monitor.VmIdentifier;
import lbframework.bean.panel.LBPanel;
import lbframework.bean.tabbedPane.LBTabbedPane;
import lbframework.gui.MensagemErroGUI;

public class Util {

    public final static String MSG_NENHUM_ITEM_SELECIONADO = "Nenhum item selecionado!";
    public final static String MSG_REGISTRO_NAO_ENCONTRADO = "Registro(s) não encontrado(s)!";
    public final static String MSG_CONFIRMA_EXCLUSAO = "Confirma exclusão?";
    public final static String MSG_SALVO_SUCESSO = "Salvo com sucesso!";
    public final static Color COR_VERIFICA = new Color(250, 250, 200);
    public final static Color COR_OBRIGATORIO = new Color(231, 248, 240);
    public final static Color COR_ZEBRADO = new Color(236, 237, 240);
    public final static Border BORDA_AZUL = BorderFactory.createLineBorder(new Color(236, 237, 240));
    public final static Border BORDA_BRANCA = BorderFactory.createLineBorder(new Color(255, 255, 255));
    public final static String FILE_LOG_GUI = "LB/LBgui.log";

    public static void exibirMensagemConfirmar(String i_mensagem, String i_title) throws Exception {
        Object[] options = {"Sim", "Não"};

        int i = JOptionPane.showOptionDialog(null, i_mensagem, i_title, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
                null, options, options[1]);

        if (i != JOptionPane.YES_OPTION) {
            throw new OperacaoCanceladaException();
        }
    }

    public static void exibirMensagemContinuar(String i_mensagem, String i_title) throws Exception {
        Object[] options = {"Ok", "Cancelar"};

        int i = JOptionPane.showOptionDialog(null, i_mensagem, i_title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE,
                null, options, options[1]);

        if (i != JOptionPane.OK_OPTION) {
            throw new OperacaoCanceladaException();
        }
    }

    public static void exibirMensagemErro(Exception ex, String i_title) {
        String mensagem = "";

        if (ex.getMessage() == null) {
            mensagem = "null";
        } else {
            mensagem = ex.getMessage();
        }

        if (ex instanceof OperacaoCanceladaException) {
            return;

        } else if (ex instanceof LBException) {
            JOptionPane.showMessageDialog(null, mensagem, i_title, JOptionPane.WARNING_MESSAGE);

        } else {
            String detalhe = mensagem + "\n\n";

            for (StackTraceElement line : ex.getStackTrace()) {
                detalhe += line.toString() + "\n";
            }

            Object[] options = {"Ok", "Detalhes >>"};

            int i = JOptionPane.showOptionDialog(null, mensagem, i_title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE,
                    null, options, options[1]);

            if (i == JOptionPane.NO_OPTION) {
                try {
                    new MensagemErroGUI(detalhe);

                } catch (Exception ex2) {
                    JOptionPane.showMessageDialog(null, ex2.getMessage(), i_title, JOptionPane.ERROR_MESSAGE);
                }
            }
        }

//        try {
//            new MensagemErroGUI(mensagem, detalhe, i_title);
//
//        } catch (Exception ex2) {
//            JOptionPane.showMessageDialog(null, mensagem, i_title, JOptionPane.WARNING_MESSAGE);
//        }
    }

    public static void exibirMensagem(String i_mensagem, String i_title) throws Exception {
        exibirMensagem(i_mensagem, i_title, 0);
    }

    public static void exibirMensagem(String i_mensagem, String i_title, int i_width) throws Exception {
        String mensagem = "";

        if (i_width > 0) {
            mensagem = "<html><div width = " + i_width + ">" + i_mensagem + "</div></html>";
        } else {
            mensagem = i_mensagem;
        }

        JOptionPane.showMessageDialog(null, mensagem, i_title, JOptionPane.INFORMATION_MESSAGE);
    }

    public static void carregarComboDiaSemana(LBComboBox i_combo) throws Exception {
        for (int i = 1; i <= 7; i++) {
            i_combo.addItem(new ItemComboVO(i, Util.formatDiaSemana(i)));
        }
    }

    public static void carregarComboMes(LBComboBox i_combo) throws Exception {
        i_combo.addItem(new ItemComboVO(1, "JANEIRO"));
        i_combo.addItem(new ItemComboVO(2, "FEVEREIRO"));
        i_combo.addItem(new ItemComboVO(3, "MARÇO"));
        i_combo.addItem(new ItemComboVO(4, "ABRIL"));
        i_combo.addItem(new ItemComboVO(5, "MAIO"));
        i_combo.addItem(new ItemComboVO(6, "JUNHO"));
        i_combo.addItem(new ItemComboVO(7, "JULHO"));
        i_combo.addItem(new ItemComboVO(8, "AGOSTO"));
        i_combo.addItem(new ItemComboVO(9, "SETEMBRO"));
        i_combo.addItem(new ItemComboVO(10, "OUTUBRO"));
        i_combo.addItem(new ItemComboVO(11, "NOVEMBRO"));
        i_combo.addItem(new ItemComboVO(12, "DEZEMBRO"));
    }

    public static String formatData(Date i_dataHora, String i_formato) throws Exception {
        return new SimpleDateFormat(i_formato).format(i_dataHora);
    }

    public static String formatData(String i_dataHora, String i_formatoEntrada, String i_formatoSaida) throws Exception {
        return new SimpleDateFormat(i_formatoSaida).format(new SimpleDateFormat(i_formatoEntrada).parse(i_dataHora));
    }

    public static String formatDataBanco(String i_data) throws Exception {
        return new SimpleDateFormat("yyyy-MM-dd").format(new SimpleDateFormat("dd/MM/yyyy").parse(i_data));
    }

    public static String formatDataGUI(Date i_data) throws Exception {
        return new SimpleDateFormat("dd/MM/yyyy").format(i_data);
    }

    public static String formatDataReduzidaGUI(String i_data) throws Exception {
        return new SimpleDateFormat("dd/MM/yy").format(new SimpleDateFormat("dd/MM/yyyy").parse(i_data));
    }

    public static String formatDataHoraGUI(Date i_dataHora) throws Exception {
        return new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(i_dataHora);
    }

    public static String formatDataHoraBanco(String i_dataHora) throws Exception {
        try {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse(i_dataHora));

        } catch (Exception ex) {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new SimpleDateFormat("dd/MM/yyyy HH:mm").parse(i_dataHora));
        }
    }

    public static String formatMesAno(String i_data) throws Exception {
        return i_data.substring(3);
    }

    public static int formatMes(String i_data) throws Exception {
        return Integer.parseInt(i_data.substring(3, 5));
    }

    public static int formatAno(String i_data) throws Exception {
        return Integer.parseInt(i_data.substring(6, 10));
    }

    public static int formatDia(String i_data) throws Exception {
        return Integer.parseInt(i_data.substring(0, 2));
    }

    public static String formatHoraGUI(Date i_hora) throws Exception {
        return new SimpleDateFormat("HH:mm:ss").format(i_hora);
    }

    public static String formatDiaSemana(String i_data) throws Exception {
        return Util.formatDiaSemana(new SimpleDateFormat("dd/MM/yyyy").parse(i_data));
    }

    public static String formatDiaSemana(Date i_data) throws Exception {
        return new SimpleDateFormat("EEEE").format(i_data).replace("á", "a").replace("ç", "c").toUpperCase();
    }

    public static String formatCep(int i_cep) throws Exception {
        String valor = new DecimalFormat("00000000").format(i_cep);
        return valor.substring(0, 2) + "." + valor.substring(2, 5) + "-" + valor.substring(5, 8);
    }

    public static int getDiaSemana(String i_data) throws Exception {
        String diaSemana = formatDiaSemana(i_data);

        if (diaSemana.equals("DOMINGO")) {
            return 1;
        } else if (diaSemana.equals("SEGUNDA-FEIRA")) {
            return 2;
        } else if (diaSemana.equals("TERCA-FEIRA")) {
            return 3;
        } else if (diaSemana.equals("QUARTA-FEIRA")) {
            return 4;
        } else if (diaSemana.equals("QUINTA-FEIRA")) {
            return 5;
        } else if (diaSemana.equals("SEXTA-FEIRA")) {
            return 6;
        } else if (diaSemana.equals("SABADO")) {
            return 7;
        } else {
            return 0;
        }
    }

    public static String formatDiaSemana(int i_dia) throws Exception {
        switch (i_dia) {
            case 1:
                return "DOMINGO";
            case 2:
                return "SEGUNDA-FEIRA";
            case 3:
                return "TERCA-FEIRA";
            case 4:
                return "QUARTA-FEIRA";
            case 5:
                return "QUINTA-FEIRA";
            case 6:
                return "SEXTA-FEIRA";
            case 7:
                return "SABADO";
            default:
                return "";
        }
    }

    public static boolean isCPFValido(String i_cpf) throws Exception {
        String cpf = new DecimalFormat("00000000000").format(Double.parseDouble(i_cpf.replace(".", "").replace("-", "")));
        int digito = Integer.parseInt(cpf.substring(9, 11));

        int digito1 = 0;

        int soma1 = 0;
        int soma2 = 0;

        int valor = 11;

        for (int i = 0; i < 9; i++) {
            soma1 += Integer.parseInt(cpf.substring(i, i + 1)) * (valor - 1);
            soma2 += Integer.parseInt(cpf.substring(i, i + 1)) * valor;

            valor--;
        }

        soma1 = (soma1 * 10) % 11;

        if (soma1 == 10) {
            soma1 = 0;
        }

        soma2 = ((soma2 + (2 * soma1)) * 10) % 11;

        if (soma2 == 10) {
            soma2 = 0;
        }

        digito1 = (soma1 * 10) + soma2;

        return (digito1 == digito);
    }

    public static boolean isDataValida(String i_data) throws Exception {
        try {
            String data = new SimpleDateFormat("dd/MM/yyyy").format(new SimpleDateFormat("dd/MM/yyyy").parse(i_data));

            if (data.equals(i_data)) {
                return true;
            } else {
                return false;
            }

        } catch (Exception ex) {
            return false;
        }
    }

    public static boolean isMesAnoValido(String i_data) throws Exception {
        try {
            String data = new SimpleDateFormat("MM/yyyy").format(new SimpleDateFormat("MM/yyyy").parse(i_data));

            if (data.equals(i_data)) {
                return true;
            } else {
                return false;
            }

        } catch (Exception ex) {
            return false;
        }
    }

    public static boolean isEan13Valido(long i_codigo) throws Exception {
        String codigo = formatNumber(i_codigo, 13);

        int somaPar = 0;
        int somaImpar = 0;

        for (int i = 0; i < 12; i += 2) {
            somaImpar += Integer.parseInt(String.valueOf(codigo.charAt(i)));
            somaPar += Integer.parseInt(String.valueOf(codigo.charAt(i + 1)));
        }

        int soma = somaImpar + (3 * somaPar);
        int digito = 0;
        int calculo = 0;

        do {
            calculo = soma % 10;

            if (calculo != 0) {
                digito += 1;
                soma += 1;
            }
        } while (calculo != 0);

        if (digito != Integer.parseInt(String.valueOf(codigo.charAt(12)))) {
            return false;
        } else {
            return true;
        }
    }

    public static boolean isDun14Valido(long i_codigo) throws Exception {
        return true;
    }

    public static boolean isEmailValido(String i_email) throws Exception {
        Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
        Matcher m = p.matcher(i_email);

        return m.matches();
    }

    public static long gerarEan13(long i_codigo, boolean i_digito) throws Exception {
        String codigo = formatNumber(i_codigo, 12);

        int somaPar = 0;
        int somaImpar = 0;

        for (int i = 0; i < 12; i += 2) {
            somaImpar += Integer.parseInt(String.valueOf(codigo.charAt(i)));
            somaPar += Integer.parseInt(String.valueOf(codigo.charAt(i + 1)));
        }

        int soma = somaImpar + (3 * somaPar);
        int digito = 0;
        boolean verifica = false;
        int calculo = 0;

        do {
            calculo = soma % 10;

            if (calculo != 0) {
                digito += 1;
                soma += 1;
            }
        } while (calculo != 0);

        if (i_digito) {
            return Long.parseLong(codigo + digito);
        } else {
            return Long.parseLong(codigo);
        }
    }

    static public boolean isInscricaoSuframaValida(String i_suframa) throws Exception {
        if (i_suframa.equals("0")) {
            return true;
        }

        if (i_suframa.length() < 9) {
            return false;
        }

        int soma = 0;

        int valida[] = {9, 8, 7, 6, 5, 4, 3, 2};

        for (int i = 0; i < valida.length; i++) {
            soma = soma + (Integer.parseInt(i_suframa.substring(i, i + 1)) * valida[i]);
        }

        int digito = 0;

        if (soma % 11 == 0) {
            digito = 0;
        } else if (soma % 11 == 1) {
            digito = 1;
        } else if (soma % 11 > 1) {
            digito = 11 - (soma % 11);
        }

        if (digito == Integer.parseInt(i_suframa.substring(8, 9))) {
            return true;
        } else {
            return false;
        }
    }

    static public boolean isCNPJValido(String i_cnpj) throws Exception {
        String cnpj = new DecimalFormat("00000000000000").format(Double.parseDouble(i_cnpj.replace(".", "").replace("/", "").replace("-", "")));
        int digito = Integer.parseInt(cnpj.substring(12, 14));

        int digito1 = 0;
        int digito2 = 0;

        int valida[] = {6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};

        for (int i = 0; i < valida.length; i++) {
            digito1 += i > 0 ? (Integer.parseInt(cnpj.substring(i - 1, i)) * valida[i]) : 0;
            digito2 += Integer.parseInt(cnpj.substring(i, i + 1)) * valida[i];
        }

        digito1 = ((digito1 % 11) < 2) ? 0 : (11 - (digito1 % 11));
        digito2 = (((digito2 % 11) < 2) ? 0 : (11 - (digito2 % 11)));

        return (((digito1 * 10) + digito2) == digito);
    }

    public static boolean isIntervaloData(String i_dataInicio, String i_dataTermino) throws ParseException {
        if ((new SimpleDateFormat("dd/MM/yyyy").parse(i_dataInicio).getTime()) > (new SimpleDateFormat("dd/MM/yyyy").parse(i_dataTermino).getTime())) {
            return false;
        } else {
            return true;
        }
    }

    public static void validarCampoTela(Vector<Component> i_campo) throws Exception {
        boolean temErro = false;
        Component campoFoco = null;

        for (Component oCampo : i_campo) {
            if (oCampo instanceof LBTextField) {
                LBTextField txtCampo = (LBTextField) oCampo;

                if (txtCampo.getClipText().equals("")) {
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof LBTextArea) {
                LBTextArea txtCampo = (LBTextArea) oCampo;

                if (txtCampo.getText().equals("")) {
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof LBTextAreaEx) {
                LBTextAreaEx txtCampo = (LBTextAreaEx) oCampo;

                if (txtCampo.getText().equals("")) {
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof LBPasswordField) {
                LBPasswordField pswCampo = (LBPasswordField) oCampo;

                if (pswCampo.getText().equals("")) {
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof LBComboBox) {
                LBComboBox cboCampo = (LBComboBox) oCampo;

                if (!cboCampo.isCheckBox()) {
                    if (cboCampo.getId() == -1) {
                        temErro = true;

                        if (campoFoco == null) {
                            campoFoco = oCampo;
                        }
                    }
                } else {
                    boolean achou = false;

                    for (int i = 0; i < cboCampo.getItemCount(); i++) {
                        if (cboCampo.isSelecionado(i)) {
                            achou = true;
                            break;
                        }
                    }

                    if (!achou) {
                        temErro = true;

                        if (campoFoco == null) {
                            campoFoco = oCampo;
                        }
                    }
                }
            } else if (oCampo instanceof LBConsultaCampo) {
                LBConsultaCampo cnsCampo = (LBConsultaCampo) oCampo;

                if (cnsCampo.getId() == -1) {
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof LBFileChooser) {
                LBFileChooser flcCampo = (LBFileChooser) oCampo;

                if (flcCampo.getArquivo().equals("")) {
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof LBCalendar) {
                LBCalendar txtCampo = (LBCalendar) oCampo;

                if (txtCampo.getClipText().equals("")) {
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else {
                throw new LBException("Campo não configurado!");
            }
        }

        if (temErro) {
            setParentSelected(campoFoco.getParent());

            ((Component) campoFoco).requestFocus();
            throw new LBException("Campo(s) preenchido(s) incorretamente!");
        }
    }

    private static void setParentSelected(Container i_container) throws Exception {
        try {
            LBPanel oPanel = null;

            if (i_container instanceof LBPanel) {
                oPanel = (LBPanel) i_container;
            }

            int i = 0;

            while (true) {
                i_container = i_container.getParent();

                if (i_container instanceof LBPanel) {
                    oPanel = (LBPanel) i_container;

                } else if (i_container instanceof LBTabbedPane) {
                    if (oPanel != null) {
                        ((LBTabbedPane) i_container).setSelectedComponent(oPanel);
                    }

                    break;
                }

                if (i > 10) {
                    break;
                }

                i++;
            }
        } catch (Exception ex) {
        }
    }

    public static void validarFiltro(Vector<Object> i_campo) throws Exception {
        boolean achou = false;
        Object campoFoco = null;

        for (Object oCampo : i_campo) {
            if (oCampo instanceof LBTextField) {
                LBTextField txtCampo = (LBTextField) oCampo;

                if (campoFoco == null) {
                    campoFoco = oCampo;
                }

                if (!txtCampo.getClipText().equals("")) {
                    achou = true;
                    break;
                }
            } else if (oCampo instanceof LBComboBox) {
                LBComboBox cboCampo = (LBComboBox) oCampo;

                if (campoFoco == null) {
                    campoFoco = oCampo;
                }

                if (!cboCampo.isCheckBox()) {
                    if (cboCampo.getId() != -1) {
                        achou = true;
                        break;
                    }
                } else {
                    for (int i = 0; i < cboCampo.getItemCount(); i++) {
                        if (cboCampo.isSelecionado(i)) {
                            achou = true;
                            break;
                        }
                    }

                    if (achou) {
                        break;
                    }
                }
            } else if (oCampo instanceof LBConsultaCampo) {
                LBConsultaCampo cnsCampo = (LBConsultaCampo) oCampo;

                if (campoFoco == null) {
                    campoFoco = oCampo;
                }

                if (cnsCampo.getId() != -1) {
                    achou = true;
                    break;
                }
            } else if (oCampo instanceof LBCalendar) {
                LBCalendar txtCampo = (LBCalendar) oCampo;

                if (campoFoco == null) {
                    campoFoco = oCampo;
                }

                if (!txtCampo.getClipText().equals("")) {
                    achou = true;
                    break;
                }
            } else if (oCampo instanceof String) {
                String valor = (String) oCampo;

                if (!valor.isEmpty()) {
                    achou = true;
                    break;
                }
            } else {
                throw new LBException("Campo não configurado!");
            }
        }

        if (!achou) {
            ((Component) campoFoco).requestFocus();
            throw new LBException("Digite um campo para consulta!");
        }
    }

    /**
     * Verifica se o intervalo entre as datas é valido
     * @param i_dataInicio - LBCalendar início
     * @param i_dataTermino = LBCalendar termino
     * @throws java.lang.Exception
     */
    public static void validarIntervaloData(LBCalendar i_txtInicio, LBCalendar i_txtTermino) throws Exception {
        if (!Util.isIntervaloData(i_txtInicio.getText(), i_txtTermino.getText())) {
            i_txtInicio.requestFocus();
            throw new LBException("Período inválido!");
        }
    }

    public static String formatCPF(long i_cpf) {
        String cpf = new DecimalFormat("00000000000").format(i_cpf);

        return cpf.substring(0, 3) + "." + cpf.substring(3, 6) + "." + cpf.substring(6, 9) + "-" + cpf.substring(9, 11);
    }

    public static String formatCNPJ(long i_cpf) {
        String cpf = new DecimalFormat("00000000000000").format(i_cpf);

        return cpf.substring(0, 2) + "." + cpf.substring(2, 5) + "." + cpf.substring(5, 8) + "/" + cpf.substring(8, 12) + "-" + cpf.substring(12, 14);
    }

    public static String formatDecimal0(double i_valor) {
        return new DecimalFormat("###,##0").format(Util.round(i_valor, 0));
    }

    public static String formatDecimal1(double i_valor) {
        return new DecimalFormat("###,##0.0").format(Util.round(i_valor, 1));
    }

    public static String formatDecimal2(double i_valor) {
        return new DecimalFormat("###,##0.00").format(Util.round(i_valor, 2));
    }

    public static String formatDecimal3(double i_valor) {
        return new DecimalFormat("###,##0.000").format(Util.round(i_valor, 3));
    }

    public static String formatDecimal4(double i_valor) {
        return new DecimalFormat("###,##0.0000").format(Util.round(i_valor, 4));
    }

    public static String formatDecimal5(double i_valor) {
        return new DecimalFormat("###,##0.00000").format(Util.round(i_valor, 5));
    }

    public static String formatDecimal6(double i_valor) {
        return new DecimalFormat("###,##0.000000").format(Util.round(i_valor, 6));
    }

    public static String formatCusto(double i_valor) {
        return new DecimalFormat("###,##0.00#").format(Util.round(i_valor, 3));
    }

    public static String getDataAtual() throws Exception {
        Statement stm = null;
        ResultSet rst = null;

        try {
            stm = Conexao.createStatement();

            rst = stm.executeQuery("SELECT NOW() AS datahora");
            rst.next();

            return new SimpleDateFormat("dd/MM/yyyy").format(rst.getTimestamp("datahora"));

        } catch (Exception ex) {
            return new SimpleDateFormat("dd/MM/yyyy").format(new Date());
        }
    }

    public static String getDataExtenso(String i_data) throws Exception {
        Date date = new SimpleDateFormat("dd/MM/yyyy").parse(i_data);

        String diaSemana = new SimpleDateFormat("EEEE").format(date).replace("á", "a").replace("ç", "c").toUpperCase();
        String dia = new SimpleDateFormat("d").format(date).toUpperCase();
        String mes = new SimpleDateFormat("MMMM").format(date).toUpperCase();
        String ano = new SimpleDateFormat("yyyy").format(date).toUpperCase();

        return diaSemana + ", " + dia + " DE " + mes + " DE " + ano;
    }

    public static String getMesExtenso(int i_mes) throws Exception {
        switch (i_mes) {
            case 1:
                return "JANEIRO";
            case 2:
                return "FEVEREIRO";
            case 3:
                return "MARCO";
            case 4:
                return "ABRIL";
            case 5:
                return "MAIO";
            case 6:
                return "JUNHO";
            case 7:
                return "JULHO";
            case 8:
                return "AGOSTO";
            case 9:
                return "SETEMBRO";
            case 10:
                return "OUTUBRO";
            case 11:
                return "NOVEMBRO";
            case 12:
                return "DEZEMBRO";
            default:
                throw new LBException("Mês inválido!");
        }
    }

    public static long getTime(String i_data) throws Exception {
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
            formatter.setTimeZone(TimeZone.getTimeZone("GMT"));

            return formatter.parse(i_data).getTime();

        } catch (Exception ex) {
            try {
                SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm");
                formatter.setTimeZone(TimeZone.getTimeZone("GMT"));

                return formatter.parse(i_data).getTime();

            } catch (Exception ex2) {
                try {
                    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
                    formatter.setTimeZone(TimeZone.getTimeZone("GMT"));

                    return formatter.parse(i_data).getTime();

                } catch (Exception ex3) {
                    try {
                        SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
                        formatter.setTimeZone(TimeZone.getTimeZone("GMT"));

                        return formatter.parse(i_data).getTime();

                    } catch (Exception ex4) {
                        try {
                            SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
                            formatter.setTimeZone(TimeZone.getTimeZone("GMT"));

                            return formatter.parse(i_data).getTime();
                        } catch (Exception ex5) {
                            SimpleDateFormat formatter = new SimpleDateFormat("MM/yyyy");
                            formatter.setTimeZone(TimeZone.getTimeZone("GMT"));

                            return formatter.parse(i_data).getTime();
                        }
                    }
                }
            }
        }
    }

    public static long dateDiff(String i_data1, String i_data2, String i_tipo) throws Exception {
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        formatter.setTimeZone(TimeZone.getTimeZone("GMT-03:00"));

        long time1 = formatter.parse(i_data1).getTime();
        long time2 = formatter.parse(i_data2).getTime();

        if (i_tipo.toLowerCase().equals("d")) {
            return (time2 - time1) / (1000 * 60 * 60 * 24);

        } else if (i_tipo.toLowerCase().equals("m")) {
            return (time2 - time1) / (1000 * 60 * 60 * 24 * 12);

        } else if (i_tipo.toLowerCase().equals("y")) {
            return (time2 - time1) / (1000 * 60 * 60 * 24 * 365);

        } else {
            throw new LBException("Tipo inválido!");
        }
    }

    public static String getDataHoraAtual() throws Exception {
        Statement stm = null;
        ResultSet rst = null;

        try {
            stm = Conexao.createStatement();

            rst = stm.executeQuery("SELECT NOW() AS datahora");
            rst.next();

            return new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(rst.getTimestamp("datahora"));

        } catch (Exception ex) {
            return new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date());
        }
    }

    public static String getHoraAtual() throws Exception {
        Statement stm = null;
        ResultSet rst = null;

        try {
            stm = Conexao.createStatement();

            rst = stm.executeQuery("SELECT NOW() AS datahora");
            rst.next();

            return new SimpleDateFormat("HH:mm:ss").format(rst.getTimestamp("datahora"));

        } catch (Exception ex) {
            SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
            formatter.setTimeZone(TimeZone.getTimeZone("GMT-03:00"));

            return formatter.format(new Date());
        }
    }

    public static String dateAdd(String i_data, String i_tipo, int i_qtde) throws Exception {
        GregorianCalendar gc = new GregorianCalendar();
        SimpleDateFormat formatter;

        try {
            formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
            formatter.setTimeZone(TimeZone.getTimeZone("GMT-03:00"));
            gc.setTime(formatter.parse(i_data));

        } catch (Exception ex) {
            try {
                formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm");
                formatter.setTimeZone(TimeZone.getTimeZone("GMT-03:00"));
                gc.setTime(formatter.parse(i_data));

            } catch (Exception ex2) {
                try {
                    formatter = new SimpleDateFormat("dd/MM/yyyy");
                    //formatter.setTimeZone(TimeZone.getTimeZone("GMT-03:00"));
                    gc.setTime(formatter.parse(i_data));

                } catch (Exception ex3) {
                    try {
                        formatter = new SimpleDateFormat("HH:mm:ss");
                        formatter.setTimeZone(TimeZone.getTimeZone("GMT-03:00"));
                        gc.setTime(formatter.parse(i_data));

                    } catch (Exception ex4) {
                        try {
                            formatter = new SimpleDateFormat("HH:mm");
                            formatter.setTimeZone(TimeZone.getTimeZone("GMT-03:00"));
                            gc.setTime(formatter.parse(i_data));

                        } catch (Exception ex5) {
                            formatter = new SimpleDateFormat("MM/yyyy");
                            //formatter.setTimeZone(TimeZone.getTimeZone("GMT-03:00"));
                            gc.setTime(formatter.parse(i_data));
                        }
                    }
                }
            }
        }

        if (i_tipo.toLowerCase().equals("d")) {
            gc.add(Calendar.DAY_OF_MONTH, i_qtde);

        } else if (i_tipo.toLowerCase().equals("m")) {
            gc.add(Calendar.MONTH, i_qtde);

        } else if (i_tipo.toLowerCase().equals("y")) {
            gc.add(Calendar.YEAR, i_qtde);

        } else if (i_tipo.toLowerCase().equals("n")) {
            gc.add(Calendar.MINUTE, i_qtde);
        }

        return formatter.format(gc.getTime());
    }

    public static int getDay(String i_data) throws Exception {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTime(new SimpleDateFormat("dd/MM/yyyy").parse(i_data));

        return gc.get(GregorianCalendar.DAY_OF_MONTH);
    }

    public static int getMonth(String i_data) throws Exception {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTime(new SimpleDateFormat("dd/MM/yyyy").parse(i_data));

        return gc.get(GregorianCalendar.MONTH);
    }

    public static int getYear(String i_data) throws Exception {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTime(new SimpleDateFormat("dd/MM/yyyy").parse(i_data));

        return gc.get(GregorianCalendar.YEAR);
    }

    public static String timeAdd(String i_hora, String i_tipo, int i_qtde) throws Exception {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTime(new SimpleDateFormat("HH:mm").parse(i_hora));

        if (i_tipo.toLowerCase().equals("h")) {
            gc.add(Calendar.HOUR, i_qtde);

        } else if (i_tipo.toLowerCase().equals("m")) {
            gc.add(Calendar.MINUTE, i_qtde);
        }

        return new SimpleDateFormat("HH:mm").format(gc.getTime());
    }

    public static String formatNumber(String i_valor, int i_tamanho) {
        String zero = "";

        for (int i = 0; i < (i_tamanho - i_valor.length()); i++) {
            zero += "0";
        }

        return zero + i_valor;
    }

    public static String formatNumber(long i_valor, int i_tamanho) {
        return formatNumber(String.valueOf(i_valor), i_tamanho);
    }

    public static String formatString(String i_textoesquerda, String i_textodireita, int i_tamanho) throws Exception {
        return i_textoesquerda + formatString("", i_tamanho - (i_textodireita.length() + i_textoesquerda.length())) + i_textodireita;
    }

    public static String formatString(String i_texto, int i_tamanho) throws Exception {
        return formatString(i_texto, i_tamanho, "e");
    }

    public static String repeatString(String i_texto, int i_tamanho) throws Exception {
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < i_tamanho; i++) {
            str.append(i_texto);
        }
        return str.toString();
    }

    /**
     *
     * @param i_texto texto a ser centralizado
     * @param i_tamanho quantidade de colunas
     * @param i_alinhamento e esquerda, d direita, c centralizado
     * @return String alinhada
     * @throws Exception
     */
    public static String formatString(String i_texto, int i_tamanho, String i_alinhamento) throws Exception {
        String texto = "";
        String espaco = "";

        if (i_texto.length() > i_tamanho) {
            texto = i_texto.substring(0, i_tamanho);
        } else {
            texto = i_texto;
        }

        if (i_alinhamento.toLowerCase().equals("e")) {
            for (int i = 0; i < (i_tamanho - texto.length()); i++) {
                espaco += " ";
            }
            return texto + espaco;

        } else if (i_alinhamento.toLowerCase().equals("d")) {
            for (int i = 0; i < (i_tamanho - texto.length()); i++) {
                espaco += " ";
            }
            return espaco + texto;

        } else if (i_alinhamento.toLowerCase().equals("c")) {
            for (int i = 0; i < ((i_tamanho - texto.length()) / 2); i++) {
                espaco += " ";
            }
            return espaco + texto;

        } else {
            return i_texto;
        }

    }

    public static boolean isHoraValida(String i_hora) throws Exception {
        try {
            String hora = new SimpleDateFormat("HH:mm:ss").format(new SimpleDateFormat("HH:mm:ss").parse(i_hora));

            if (hora.equals(i_hora)) {
                return true;
            } else {
                return false;
            }
        } catch (Exception ex) {
            try {
                String hora = new SimpleDateFormat("HH:mm").format(new SimpleDateFormat("HH:mm").parse(i_hora));

                if (hora.equals(i_hora)) {
                    return true;
                } else {
                    return false;
                }
            } catch (Exception ex2) {
                return false;
            }
        }
    }

    public static String getMd5(String i_texto) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        BigInteger hash = new BigInteger(1, md.digest(i_texto.getBytes()));

        return Util.formatNumber(hash.toString(16), 32);
    }

    public static double round(double i_valor, int i_qtd) {
        if (Double.isNaN(i_valor) || Double.isInfinite(i_valor)) {
            i_valor = 0;
        }

        BigDecimal valorExato = new BigDecimal(String.valueOf(i_valor)).setScale(i_qtd, RoundingMode.HALF_UP);
        return valorExato.doubleValue();
    }

    public static String getGoogle(String i_campo, String i_texto) throws Exception {
        String[] aPalaLBa = i_texto.split(" ");
        String retorno = "";

        for (int i = 0; i < aPalaLBa.length; i++) {
            if (!aPalaLBa[i].equals("")) {
                if (!retorno.equals("")) {
                    retorno += " AND ";
                }

                if (aPalaLBa[i].startsWith("=")) {
                    retorno += "(" + i_campo + " ILIKE '" + aPalaLBa[i].substring(1, aPalaLBa[i].length()) + "%')";
                } else {
                    retorno += "(" + i_campo + " ILIKE '" + aPalaLBa[i] + "%' OR " + i_campo + " ILIKE '% " + aPalaLBa[i] + "%')";
                }
            }
        }

        return "(" + retorno + ")";
    }

    public static String toProperCase(String s) {
        Pattern p = Pattern.compile("(^|\\W)([a-z])");
        Matcher m = p.matcher(s.toLowerCase());
        StringBuffer sb = new StringBuffer(s.length());

        while (m.find()) {
            m.appendReplacement(sb, m.group(1) + m.group(2).toUpperCase());
        }

        m.appendTail(sb);

        return sb.toString();
    }

    public static int getQuantidadeDiaMes(String i_mesAno) throws Exception {
        String ultimoDia = getUltimoDiaMes(i_mesAno);
        return Integer.parseInt(ultimoDia.substring(0, 2));
    }

    public static String getUltimoDiaMes(String i_mesAno) throws Exception {
        return Util.dateAdd(Util.dateAdd("01/" + i_mesAno, "m", 1), "d", -1);
    }

    public static String getValorExtenso(double i_valor) {
        String extenso = "";
        String tipo = "";
        String parte1 = "";
        String valor = formatDecimal2(i_valor);
        int cont = valor.length();
        int i = 0;
        int somar = 1;

        if (i_valor <= 0) {
            return "";
        }

        while (i < cont) {
            somar = 1;
            if (valor.substring(i, i + 1).equals(",") == false && valor.substring(i, i + 1).equals(".") == false) {
                if (cont == 4 && i == 0) {
                    tipo = "unitario";
                } else if (cont == 4 && i == 2) {
                    tipo = "dezena";
                } else if (cont == 4 && i == 3) {
                    tipo = "unitario";
                } else if (cont == 5 && i == 0) {
                    tipo = "dezena";
                } else if (cont == 5 && i == 1) {
                    tipo = "unitario";
                } else if (cont == 5 && i == 3) {
                    tipo = "dezena";
                } else if (cont == 5 && i == 4) {
                    tipo = "unitario";
                } else if (cont == 6 && i == 0) {
                    tipo = "centena";
                } else if (cont == 6 && i == 1) {
                    tipo = "dezena";
                } else if (cont == 6 && i == 2) {
                    tipo = "unitario";
                } else if (cont == 6 && i == 4) {
                    tipo = "dezena";
                } else if (cont == 6 && i == 5) {
                    tipo = "unitario";
                } else if (cont == 8 && i == 0) {
                    tipo = "unitario";
                } else if (cont == 8 && i == 2) {
                    tipo = "centena";
                } else if (cont == 8 && i == 3) {
                    tipo = "dezena";
                } else if (cont == 8 && i == 4) {
                    tipo = "unitario";
                } else if (cont == 8 && i == 6) {
                    tipo = "dezena";
                } else if (cont == 8 && i == 7) {
                    tipo = "unitario";
                } else if (cont == 9 && i == 0) {
                    tipo = "dezena";
                } else if (cont == 9 && i == 1) {
                    tipo = "unitario";
                } else if (cont == 9 && i == 3) {
                    tipo = "centena";
                } else if (cont == 9 && i == 4) {
                    tipo = "dezena";
                } else if (cont == 9 && i == 5) {
                    tipo = "unitario";
                } else if (cont == 9 && i == 7) {
                    tipo = "dezena";
                } else if (cont == 9 && i == 8) {
                    tipo = "unitario";
                } else if (cont == 10 && i == 0) {
                    tipo = "centena";
                } else if (cont == 10 && i == 1) {
                    tipo = "dezena";
                } else if (cont == 10 && i == 2) {
                    tipo = "unitario";
                } else if (cont == 10 && i == 4) {
                    tipo = "centena";
                } else if (cont == 10 && i == 5) {
                    tipo = "dezena";
                } else if (cont == 10 && i == 6) {
                    tipo = "unitario";
                } else if (cont == 10 && i == 8) {
                    tipo = "dezena";
                } else if (cont == 10 && i == 9) {
                    tipo = "unitario";
                }

                if (tipo.equals("unitario")) {
                    if (valor.substring(i, i + 1).equals("1")) {
                        parte1 = "Um ";
                    } else if (valor.substring(i, i + 1).equals("2")) {
                        parte1 = "Dois ";
                    } else if (valor.substring(i, i + 1).equals("3")) {
                        parte1 = "Tres ";
                    } else if (valor.substring(i, i + 1).equals("4")) {
                        parte1 = "Quatro ";
                    } else if (valor.substring(i, i + 1).equals("5")) {
                        parte1 = "Cinco ";
                    } else if (valor.substring(i, i + 1).equals("6")) {
                        parte1 = "Seis ";
                    } else if (valor.substring(i, i + 1).equals("7")) {
                        parte1 = "Sete ";
                    } else if (valor.substring(i, i + 1).equals("8")) {
                        parte1 = "Oito ";
                    } else if (valor.substring(i, i + 1).equals("9")) {
                        parte1 = "Nove ";
                    } else if (valor.substring(i, i + 1).equals("0")) {
                        parte1 = "";
                    }
                }

                if (tipo.equals("dezena")) {
                    if (valor.substring(i, i + 1).equals("1")) {
                        if (valor.substring(i, i + 2).equals("10")) {
                            parte1 = "Dez ";
                        } else if (valor.substring(i, i + 2).equals("11")) {
                            parte1 = "Onze ";
                        } else if (valor.substring(i, i + 2).equals("12")) {
                            parte1 = "Doze ";
                        } else if (valor.substring(i, i + 2).equals("13")) {
                            parte1 = "Treze ";
                        } else if (valor.substring(i, i + 2).equals("14")) {
                            parte1 = "Quatorze ";
                        } else if (valor.substring(i, i + 2).equals("15")) {
                            parte1 = "Quinze ";
                        } else if (valor.substring(i, i + 2).equals("16")) {
                            parte1 = "Dezesseis ";
                        } else if (valor.substring(i, i + 2).equals("17")) {
                            parte1 = "Dezesete ";
                        } else if (valor.substring(i, i + 2).equals("18")) {
                            parte1 = "Dezoito ";
                        } else if (valor.substring(i, i + 2).equals("19")) {
                            parte1 = "Dezenove ";
                        }
                        somar = 2;
                    } else if (valor.substring(i, i + 1).equals("2")) {
                        parte1 = "Vinte ";
                    } else if (valor.substring(i, i + 1).equals("3")) {
                        parte1 = "Trinta ";
                    } else if (valor.substring(i, i + 1).equals("4")) {
                        parte1 = "Quarenta ";
                    } else if (valor.substring(i, i + 1).equals("5")) {
                        parte1 = "Cinquenta ";
                    } else if (valor.substring(i, i + 1).equals("6")) {
                        parte1 = "Sessenta ";
                    } else if (valor.substring(i, i + 1).equals("7")) {
                        parte1 = "Setenta ";
                    } else if (valor.substring(i, i + 1).equals("8")) {
                        parte1 = "Oitenta ";
                    } else if (valor.substring(i, i + 1).equals("9")) {
                        parte1 = "Noventa ";
                    } else if (valor.substring(i, i + 1).equals("0")) {
                        parte1 = "";
                    }
                }

                if (tipo.equals("centena")) {
                    if (valor.substring(i, i + 1).equals("1")) {
                        if (valor.substring(i, i + 3).equals("100")) {
                            parte1 = "Cem ";
                        } else {
                            parte1 = "Cento ";
                        }
                    } else if (valor.substring(i, i + 1).equals("2")) {
                        parte1 = "Duzentos ";
                    } else if (valor.substring(i, i + 1).equals("3")) {
                        parte1 = "Trezentos ";
                    } else if (valor.substring(i, i + 1).equals("4")) {
                        parte1 = "Quatrocentos ";
                    } else if (valor.substring(i, i + 1).equals("5")) {
                        parte1 = "Quinhentos ";
                    } else if (valor.substring(i, i + 1).equals("6")) {
                        parte1 = "Seiscentos ";
                    } else if (valor.substring(i, i + 1).equals("7")) {
                        parte1 = "Setecentos ";
                    } else if (valor.substring(i, i + 1).equals("8")) {
                        parte1 = "Oitocentos ";
                    } else if (valor.substring(i, i + 1).equals("9")) {
                        parte1 = "Novecentos ";
                    } else if (valor.substring(i, i + 1).equals("0")) {
                        parte1 = "";
                    }
                }

                if (i == 0 || valor.substring(i - 1, i).equals(",")) {
                    extenso = extenso + parte1;
                } else if (valor.substring(i, i + 1).equals("0") == false) {
                    if (extenso.equals("")) {
                        extenso = extenso + parte1;
                    } else {
                        extenso = extenso + "e " + parte1;
                    }
                }
            } else if (valor.substring(i, i + 1).equals(",")) {
                if (cont == 4 && Integer.parseInt(valor.substring(i - 1, i)) == 1) {
                    extenso = extenso + "Real ";
                } else if (cont > 4 || Integer.parseInt(valor.substring(i - 1, i)) > 1) {
                    extenso = extenso + "Reais ";
                }
            } else if (valor.substring(i, i + 1).equals(".")) {
                extenso = extenso + "Mil "; //se sim, acrescenta a palaLBa "Mil"
            }

            i = i + somar;

        }

        if (Integer.parseInt(valor.substring(cont - 2, cont)) > 1) {
            extenso = extenso + "Centavos"; //se sim, acrescenta a palaLBa Centavos
        } else if (Integer.parseInt(valor.substring(cont - 2, cont)) == 1) {
            extenso = extenso + "Centavo"; //se não, acrescenta a palaLBa Centavo
        }

        return extenso.trim();
    }

    public static void enviarEmail(String i_destinatario, String i_assunto, String i_texto, Vector<String> i_anexo) throws Exception {
        Multipart mp = new MimeMultipart();

        //adiciona texto
        MimeBodyPart textPart = new MimeBodyPart();
        textPart.setText(i_texto);

        mp.addBodyPart(textPart);

        //adiciona anexo
        for (String anexo : i_anexo) {
            File file = new File(anexo);

            MimeBodyPart attachFile = new MimeBodyPart();
            attachFile.setDataHandler(new DataHandler(new FileDataSource(file)));
            attachFile.setFileName(file.getName());

            mp.addBodyPart(attachFile);
        }

        //configura email
        java.util.Properties prop = new java.util.Properties();
        prop.put("mail.transport.protocol", "smtp");
        prop.put("mail.smtp.host", Email.servidor);
        prop.put("mail.smtp.auth", Email.autenticacao);
        prop.put("mail.smtp.starttls.enable", Email.tls);
        prop.put("mail.smtp.starttls.required", Email.tls);

        if (Email.porta != 0) {
            prop.put("mail.smtp.port", Email.porta);
        }

        Session mailSession = Session.getInstance(prop, new SMTPAuthenticator(Email.usuario, Email.senha));

        //edita mensagem
        MimeMessage message = new MimeMessage(mailSession);

        message.setSubject(i_assunto);
        message.setFrom(new InternetAddress(Email.usuario));
        message.setContent(mp);

        //adiciona destinatario
        String destinatario[] = i_destinatario.trim().replace(",", ";").split(";");

        for (int i = 0; i < destinatario.length; i++) {
            if (!isEmailValido(destinatario[i])) {
                throw new LBException("Email inválido!");
            }

            message.addRecipient(Message.RecipientType.TO, new InternetAddress(destinatario[i]));
        }

        //envia email
        Transport transport = mailSession.getTransport();

        transport.connect();
        Transport.send(message, message.getRecipients(Message.RecipientType.TO));
        transport.close();
    }

    public static void testarConexaoEmail(String i_usuario, String i_senha, String i_servidor, boolean i_autenticacao, boolean i_tls, int i_porta) throws Exception {
        conectarEmail(i_usuario, i_senha, i_servidor, i_porta, i_autenticacao, i_tls);
    }

    private static Session conectarEmail(String i_usuario, String i_senha, String i_servidor, int i_porta, boolean i_autenticacao, boolean i_tls) throws Exception {
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);

        Properties prop = new java.util.Properties();
        //prop.put("mail.debug", "true");
        prop.put("mail.transport.protocol", "smtp");
        prop.put("mail.smtp.host", i_servidor);
        prop.put("mail.smtp.auth", String.valueOf(i_autenticacao));
        prop.put("mail.smtp.starttls.enable", String.valueOf(i_tls));
        prop.put("mail.smtp.starttls.required", String.valueOf(i_tls));
        prop.put("mail.smtp.ssl.socketFactory", sf);

        if (i_porta != 0) {
            prop.put("mail.smtp.port", i_porta);
        }

        Session mailSession = Session.getInstance(prop, new SMTPAuthenticator(i_usuario, i_senha));
        //mailSession.setDebug(true);

        Transport transport = mailSession.getTransport();
        transport.connect();
        transport.close();

        return mailSession;
    }

    public static String criptografarBase64(String i_input) throws Exception {
        return new Base64Encoder(i_input).processString();
    }

    public static String descriptografarBase64(String i_input) throws Exception {
        return new Base64Decoder(i_input).processString();
    }

    public static void imprimir(String i_texto) throws Exception {
        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPrintable(new LBPrintable(i_texto));

        if (!job.printDialog()) {
            throw new OperacaoCanceladaException();
        }

        job.print();
    }

    public static String getRoot() throws Exception {
        if (System.getProperties().getProperty("file.separator").equals("\\")) {
            return "c:/";
        } else {
            return "/";
        }
    }

    public static String getIp() throws Exception {
        InetAddress end = InetAddress.getLocalHost();
        return end.toString();
    }

    public static String converteCorDecimalVB(String i_hexa) throws Exception {
        String r = i_hexa.substring(0, 2);
        String g = i_hexa.substring(2, 4);
        String b = i_hexa.substring(4, 6);

        return b + g + r;
    }

    public static String converteCorHexadecimalVB(String i_decimal) throws Exception {
        String decimal = Util.formatNumber(i_decimal, 6);

        String b = decimal.substring(0, 2);
        String g = decimal.substring(2, 4);
        String r = decimal.substring(4, 6);

        return r + g + b;
    }

    public static boolean isNumero(String i_valor) throws Exception {
        String accepted = "1234567890";

        for (int i = 0; i < i_valor.length(); i++) {
            if (!accepted.contains(i_valor.substring(i, i + 1))) {
                return false;
            }
        }

        if (i_valor.equals("")) {
            return false;
        } else {
            return true;
        }
    }

    public static void validarChave(long i_cnpj, String i_dataAtual, String i_sistema) throws Exception {
        Statement stm = null;
        StringBuilder sql = null;
        ResultSet rst = null;

        stm = Conexao.createStatement();

        //verifica 12 meses
        for (int i = 0; i < 12; i++) {
            String mes = Util.formatMesAno(Util.dateAdd("01/" + Util.formatMesAno(i_dataAtual), "m", i));
            String chave = Util.formatNumber(i_cnpj, 14).substring(0, 8) + mes.replace("/", "") + i_sistema;

            sql = new StringBuilder();
            sql.append("SELECT id FROM chave WHERE chave = MD5('" + chave + "')");

            rst = stm.executeQuery(sql.toString());

            if (rst.next()) {
                return;
            }
        }

        //verifica mes anterior
        String mesAnterior = Util.formatMesAno(Util.dateAdd("01/" + Util.formatMesAno(i_dataAtual), "m", -1));
        String chave = Util.formatNumber(i_cnpj, 14).substring(0, 8) + mesAnterior.replace("/", "") + i_sistema;

        sql = new StringBuilder();
        sql.append("SELECT id FROM chave WHERE chave = MD5('" + chave + "')");

        rst = stm.executeQuery(sql.toString());

        if (!rst.next()) {
            throw new LBException("Erro na validação da chave! Favor entrar em contato com a LB Software.");
        }

        //verifica data expiração
        String dataInicioExpiracao = "20/" + Util.formatMesAno(i_dataAtual);

        if (Util.getTime(i_dataAtual) < Util.getTime(dataInicioExpiracao)) {
            return;
        }

        String dataExpiracao = Util.getUltimoDiaMes(Util.formatMesAno(i_dataAtual));

        if (Util.getTime(i_dataAtual) > Util.getTime(dataExpiracao)) {
            throw new LBException("Erro na validação da chave! Favor entrar em contato com a LB Software.");
        }

        long dias = Util.dateDiff(i_dataAtual, dataExpiracao, "d");

        Util.exibirMensagem("Erro na validação da chave! Favor entrar em contato com a LB Software.", "Atenção");

        stm.close();
    }

    public static void setLookAndFeel() throws Exception {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception ex) {
        }
    }

    public static void appPrevInstance() throws Exception {
        boolean aberto = false;
        try {
            RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
            int runtimePid = Integer.parseInt(rt.getName().substring(0, rt.getName().indexOf("@")));

            MonitoredHost host = MonitoredHost.getMonitoredHost(new HostIdentifier((String) null));
            Set vms = host.activeVms();

            MonitoredVm mvm = host.getMonitoredVm(new VmIdentifier(String.valueOf(runtimePid)));
            String processName = MonitoredVmUtil.commandLine(mvm);
            processName = processName.substring(processName.lastIndexOf("\\") + 1, processName.length());
            mvm.detach();

            for (Object vmid : vms) {
                if (vmid instanceof Integer) {
                    int pid = ((Integer) vmid).intValue();

                    String name = vmid.toString();
                    mvm = host.getMonitoredVm(new VmIdentifier(name));
                    name = MonitoredVmUtil.commandLine(mvm);
                    name = name.substring(name.lastIndexOf("\\") + 1, name.length());
                    mvm.detach();

                    if ((name.equalsIgnoreCase(processName)) && (runtimePid != pid)) {
                        aberto = true;
                        break;
                    }
                }
            }
        } catch (Exception ex) {
        }

        if (aberto) {
            throw new LBException("Este aplicativo já está em execução!");
        }
    }

    public static boolean isInscricaoEstadualValida(int i_idEstado, String i_inscricaoEstadual) throws Exception {
        if (i_inscricaoEstadual.equals("ISENTO")) {
            return true;
        }

        i_inscricaoEstadual = i_inscricaoEstadual.replace(".", "").replace("/", "").replace("-", "").trim();

        if (!isNumero(i_inscricaoEstadual)) {
            return false;
        }

        switch (i_idEstado) {
            case 12: //AC
                return isInscricaoEstadualACValida(i_inscricaoEstadual);
            case 27: //AL
                return isInscricaoEstadualALValida(i_inscricaoEstadual);
            case 13: //AM
                return isInscricaoEstadualAMValida(i_inscricaoEstadual);
            case 16: //AP
                return isInscricaoEstadualAPValida(i_inscricaoEstadual);
            case 29: //BA
                return isInscricaoEstadualBAValida(i_inscricaoEstadual);
            case 23: //CE
                return isInscricaoEstadualCEValida(i_inscricaoEstadual);
            case 53: //DF
                return isInscricaoEstadualDFValida(i_inscricaoEstadual);
            case 32: //ES
                return isInscricaoEstadualESValida(i_inscricaoEstadual);
            case 52: //GO
                return isInscricaoEstadualGOValida(i_inscricaoEstadual);
            case 21: //MA
                return isInscricaoEstadualMAValida(i_inscricaoEstadual);
            case 31: //MG
                return isInscricaoEstadualMGValida(i_inscricaoEstadual);
            case 50: //MS
                return isInscricaoEstadualMSValida(i_inscricaoEstadual);
            case 51: //MT
                return isInscricaoEstadualMTValida(i_inscricaoEstadual);
            case 15: //PA
                return isInscricaoEstadualPAValida(i_inscricaoEstadual);
            case 25: //PB
                return isInscricaoEstadualPBValida(i_inscricaoEstadual);
            case 26: //PE
                return isInscricaoEstadualPEValida(i_inscricaoEstadual);
            case 22: //PI
                return isInscricaoEstadualPIValida(i_inscricaoEstadual);
            case 41: //PR
                return isInscricaoEstadualPRValida(i_inscricaoEstadual);
            case 33: //RJ
                return isInscricaoEstadualRJValida(i_inscricaoEstadual);
            case 24: //RN
                return isInscricaoEstadualRNValida(i_inscricaoEstadual);
            case 11: //RO
                return isInscricaoEstadualROValida(i_inscricaoEstadual);
            case 14: //RR
                return isInscricaoEstadualRRValida(i_inscricaoEstadual);
            case 43: //RS
                return isInscricaoEstadualRSValida(i_inscricaoEstadual);
            case 42: //SC
                return isInscricaoEstadualSCValida(i_inscricaoEstadual);
            case 28: //SE
                return isInscricaoEstadualSEValida(i_inscricaoEstadual);
            case 35: //SP
                return isInscricaoEstadualSPValida(i_inscricaoEstadual);
            case 17: //TO
                return isInscricaoEstadualTOValida(i_inscricaoEstadual);
            default:
                return false;
        }
    }

    private static boolean isInscricaoEstadualACValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 13);

        for (int i = 1; i < 3; i++) {
            switch (i) {
                case 1:
                    peso = new int[]{4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};
                    posicao = 12;
                    break;
                case 2:
                    peso = new int[]{5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};
                    posicao = 13;
                    i_inscricaoEstadual += String.valueOf(digito);
                    break;
            }

            for (int j = 1; j <= peso.length; j++) {
                soma += Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1];
            }

            resto = soma % 11;
            digito = 11 - resto;

            if (digito == 10 || digito == 11) {
                digito = 0;
            }

            if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
                return false;
            }
        }

        return true;
    }

    private static boolean isInscricaoEstadualALValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }
        soma = soma * 10;
        resto = soma / 11;
        resto = soma - (resto * 11);

        if (resto == 10) {
            digito = 0;
        } else {
            digito = resto;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualAMValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i < peso.length + 1; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        if (soma < 11) {
            digito = 11 - soma;
        } else {
            resto = soma % 11;

            if (resto <= 1) {
                digito = 0;
            } else {
                digito = 11 - resto;
            }
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualAPValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;
        int subtrai = 0;
        int p = 0;
        int d = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        if (!i_inscricaoEstadual.substring(0, 2).equals("03")) {
            return false;
        }

        if (((Integer.parseInt(i_inscricaoEstadual.substring(0, 8))) >= 3000001) && ((Integer.parseInt(i_inscricaoEstadual.substring(0, 8))) <= 3017000)) {
            p = 5;
            d = 0;
        } else if (((Integer.parseInt(i_inscricaoEstadual)) >= 3017001) && ((Integer.parseInt(i_inscricaoEstadual)) <= 3019022)) {
            p = 0;
            d = 1;
        } else if ((Integer.parseInt(i_inscricaoEstadual)) >= 3019023) {
            p = 0;
            d = 0;
        }

        for (int i = 1; i < peso.length + 1; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        soma = soma + p;
        resto = soma % 11;
        subtrai = 11 - resto;

        if (soma == 10) {
            digito = 0;
        } else if (subtrai == 11) {
            digito = d;
        } else {
            digito = subtrai;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualBAValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int subtrai = 0;
        int posicao = 0;
        int peso[] = null;
        int resto = 0;
        int digito = 0;
        String iE = "";

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 8);
        iE = i_inscricaoEstadual.substring(0, 7);
        posicao = i_inscricaoEstadual.length();

        if ((!i_inscricaoEstadual.substring(0, 1).equals("6")) && (!i_inscricaoEstadual.substring(0, 1).equals("7")) && (!i_inscricaoEstadual.substring(0, 1).equals("9"))) {
            for (int i = 1; i < 3; i++) {
                if (i == 1) {
                    peso = new int[]{7, 6, 5, 4, 3, 2};
                    posicao = 8;
                } else {
                    iE = iE.substring(0, 6) + String.valueOf(digito);
                    peso = new int[]{8, 7, 6, 5, 4, 3, 2};
                    posicao = 7;
                    soma = 0;
                }

                for (int j = 1; j <= peso.length; j++) {
                    soma = soma + ((Integer.parseInt(iE.substring(j - 1, j))) * peso[j - 1]);
                }

                resto = soma % 10;
                subtrai = 10 - resto;

                if (subtrai == 0) {
                    digito = 0;
                } else {
                    digito = subtrai;
                }

                if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
                    return false;
                }
            }
        } else {
            for (int i = 1; i < 3; i++) {
                if (i == 1) {
                    peso = new int[]{7, 6, 5, 4, 3, 2};
                    posicao = 8;
                } else {
                    iE = iE + String.valueOf(digito);
                    peso = new int[]{8, 7, 6, 5, 4, 3, 2};
                    posicao = 7;
                    soma = 0;
                }
                for (int j = 1; j <= peso.length; j++) {
                    soma = soma + ((Integer.parseInt(iE.substring(j - 1, j))) * peso[j - 1]);
                }

                resto = soma % 11;
                subtrai = 11 - resto;

                if (subtrai == 0 && subtrai == 1) {
                    digito = 0;
                } else {
                    digito = subtrai;
                }
                if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
                    return false;
                }
            }
        }

        return true;
    }

    private static boolean isInscricaoEstadualCEValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int subtrai = 0;
        int posicao = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;
        subtrai = 11 - resto;

        if (subtrai == 10 || subtrai == 11) {
            digito = 0;
        } else {
            digito = subtrai;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualDFValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int subtrai = 0;
        int posicao = 0;
        int peso[] = null;
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 13);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i < 3; i++) {
            switch (i) {
                case 1:
                    peso = new int[]{4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};
                    posicao = 12;
                    break;

                case 2:
                    peso = new int[]{5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};
                    posicao = 13;
                    soma = 0;
                    break;
            }
            for (int j = 1; j <= peso.length; j++) {
                soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(j - 1, j)) * peso[j - 1]);
            }

            resto = soma % 11;
            subtrai = 11 - resto;

            if (subtrai == 10 || subtrai == 11) {
                digito = 0;
            } else {
                digito = subtrai;
            }

            if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
                return false;
            }
        }

        return true;
    }

    private static boolean isInscricaoEstadualESValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;

        if (resto < 2) {
            digito = 0;
        } else {
            digito = 11 - resto;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualGOValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;

        if (i_inscricaoEstadual.substring(0, 8).equals("11094402")) {
            if ((i_inscricaoEstadual.substring(posicao - 1, posicao).equals("0")) || (i_inscricaoEstadual.substring(posicao - 1, posicao).equals("1"))) {
                return true;
            }
        }

        if (resto == 0) {
            digito = 0;
        } else if (resto == 1 && i_inscricaoEstadual.substring(0, 8).equals("10103105") && i_inscricaoEstadual.substring(0, 8).equals("10119997")) {
            digito = 1;
        } else if (resto == 1) {
            digito = 0;
        } else {
            digito = 11 - resto;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualMAValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;

        if (resto == 0 || resto == 1) {
            digito = 0;
        } else {
            digito = 11 - resto;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualMGValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int somaTotal = 0;
        int posicao = 0;
        int subtrai = 0;
        int peso[] = null;
        int digito = 0;
        String iE = "";
        int multiplica = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 13);

        for (int i = 1; i < 3; i++) {
            switch (i) {
                case 1:
                    peso = new int[]{1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2};
                    iE = i_inscricaoEstadual.substring(0, 3) + "0" + i_inscricaoEstadual.substring(3, 11);
                    posicao = 12;
                    break;
                case 2:
                    peso = new int[]{3, 2, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2};
                    iE = i_inscricaoEstadual.substring(0, 12);
                    soma = 0;
                    posicao = 13;
                    break;
            }

            multiplica = 0;

            for (int j = 1; j <= peso.length; j++) {
                multiplica = Integer.parseInt(iE.substring(j - 1, j)) * peso[j - 1];

                if (i == 1) {
                    for (int x = 1; x <= String.valueOf(multiplica).length(); x++) {
                        soma = soma + Integer.parseInt(String.valueOf(multiplica).substring(x - 1, x));
                    }
                } else {
                    soma = soma + multiplica;
                }
            }

            if (i == 1) {
                somaTotal = soma;
                Double.parseDouble(String.valueOf(soma));
                digito = ((soma + 10) - ((soma / 10) * 10)) * 10 - somaTotal;
                digito = Integer.parseInt(String.valueOf(digito).substring(String.valueOf(digito).length() - 1));
            } else {
                subtrai = soma % 11;
                if (subtrai == 1 || subtrai == 0) {
                    digito = 0;
                } else {
                    digito = 11 - subtrai;
                }
            }

            if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
                return false;
            }
        }

        return true;
    }

    private static boolean isInscricaoEstadualMSValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;

        if (resto == 0) {
            digito = 0;
        } else {
            digito = 11 - resto;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        }

        return true;
    }

    private static boolean isInscricaoEstadualMTValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {3, 2, 9, 8, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 11);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;

        if (resto == 0) {
            digito = 0;
        } else {
            digito = 11 - resto;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        }

        return true;
    }

    private static boolean isInscricaoEstadualPAValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;

        if (resto == 0 || resto == 1) {
            digito = 0;
        } else {
            digito = 11 - resto;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        }

        return true;
    }

    private static boolean isInscricaoEstadualPBValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int subtrai = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;
        subtrai = 11 - resto;

        if (subtrai == 10 || subtrai == 11) {
            digito = 0;
        } else {
            digito = subtrai;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        }

        return true;
    }

    private static boolean isInscricaoEstadualPEValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int subtrai = 0;
        int posicao = 0;
        int peso[] = null;
        int resto = 0;
        int digito = 0;
        String iE = "";

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        iE = i_inscricaoEstadual.substring(0, 8);

        if (i_inscricaoEstadual.length() == 9) {
            for (int i = 1; i < 3; i++) {
                if (i == 1) {
                    peso = new int[]{8, 7, 6, 5, 4, 3, 2};
                    posicao = 8;
                } else {
                    iE = iE + String.valueOf(digito);
                    peso = new int[]{9, 8, 7, 6, 5, 4, 3, 2};
                    soma = 0;
                    posicao = 9;
                }
                for (int j = 1; j <= peso.length; j++) {
                    soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(j - 1, j)) * peso[j - 1]);
                }
                resto = soma % 11;

                if (resto == 0 || resto == 1) {
                    digito = 0;
                } else {
                    digito = 11 - resto;
                }
                if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
                    return false;
                }
            }
        } else if (i_inscricaoEstadual.length() == 14) {
            peso = new int[]{5, 4, 3, 2, 1, 9, 8, 7, 6, 5, 4, 3, 2};

            for (int i = 1; i <= peso.length; i++) {
                soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
            }

            resto = soma % 11;
            subtrai = 11 - resto;

            if (subtrai > 9) {
                digito = 10 - subtrai;
            } else {
                digito = subtrai;
            }

            if (digito != Integer.parseInt(i_inscricaoEstadual.substring(13, 14))) {
                return false;
            }
        } else {
            return false;
        }

        return true;
    }

    private static boolean isInscricaoEstadualPIValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int subtrai = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;
        subtrai = 11 - resto;

        if (subtrai == 10 || subtrai == 11) {
            digito = 0;
        } else {
            digito = subtrai;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualPRValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int subtrai = 0;
        int posicao = 0;
        int peso[] = null;
        int resto = 0;
        int digito = 0;
        String iE = "";

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 10);

        for (int i = 1; i < 3; i++) {
            switch (i) {
                case 1:
                    iE = i_inscricaoEstadual.substring(0, 7);
                    peso = new int[]{3, 2, 7, 6, 5, 4, 3, 2};
                    posicao = 9;
                    break;

                case 2:
                    iE = i_inscricaoEstadual.substring(0, 7);
                    peso = new int[]{4, 3, 2, 7, 6, 5, 4, 3, 2};
                    posicao = 10;
                    soma = 0;
                    break;
            }

            for (int j = 1; j <= peso.length; j++) {
                soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(j - 1, j)) * peso[j - 1]);
            }

            resto = soma % 11;
            subtrai = 11 - resto;

            if (subtrai == 10 || subtrai == 11) {
                digito = 0;
            } else {
                digito = subtrai;
            }

            if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
                return false;
            }
        }

        return true;
    }

    private static boolean isInscricaoEstadualRJValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {2, 7, 6, 5, 4, 3, 2};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 8);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;

        if (resto <= 1) {
            digito = 0;
        } else {
            digito = 11 - resto;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualRNValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int subtrai = 0;
        int peso[] = null;
        int resto = 0;
        int digito = 0;

        if (i_inscricaoEstadual.length() == 9) {
            i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
            peso = new int[]{9, 8, 7, 6, 5, 4, 3, 2};
        } else {
            i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 10);
            peso = new int[]{10, 9, 8, 7, 6, 5, 4, 3, 2};
        }
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        subtrai = soma * 10;
        resto = subtrai % 11;

        if (resto == 10) {
            digito = 0;
        } else {
            digito = resto;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualROValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int resto = 0;
        int subtrai = 0;
        int posicao = 0;
        int peso[] = {6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 14);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;
        subtrai = 11 - resto;

        if (subtrai == 10 || subtrai == 11) {
            digito = subtrai - 10;
        } else {
            digito = subtrai;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualRRValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {1, 2, 3, 4, 5, 6, 7, 8};
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        digito = soma % 9;

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualRSValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int resto = 0;
        int posicao = 0;
        int peso[] = {2, 9, 8, 7, 6, 5, 4, 3, 2};
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 10);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;
        digito = 11 - resto;

        if (digito == 10 || digito == 11) {
            digito = 0;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualSCValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int resto = 0;
        int posicao = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;
        digito = 11 - resto;

        if (resto == 0 || resto == 1) {
            digito = 0;
        }

        if (digito == 10 || digito == 11) {
            digito = 0;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualSEValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int resto = 0;
        int posicao = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 9);
        posicao = i_inscricaoEstadual.length();

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(i_inscricaoEstadual.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;
        digito = 11 - resto;

        if (digito == 10 || digito == 11) {
            digito = 0;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualTOValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int resto = 0;
        int posicao = 0;
        int peso[] = {9, 8, 7, 6, 5, 4, 3, 2};
        int digito = 0;
        String iE = "";

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 11);
        posicao = i_inscricaoEstadual.length();
        iE = (i_inscricaoEstadual.substring(0, 2)) + (i_inscricaoEstadual.substring(4, 10));

        for (int i = 1; i <= peso.length; i++) {
            soma = soma + (Integer.parseInt(iE.substring(i - 1, i)) * peso[i - 1]);
        }

        resto = soma % 11;

        if (resto < 2) {
            digito = 0;
        } else {
            digito = 11 - resto;
        }

        if (digito != Integer.parseInt(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
            return false;
        } else {
            return true;
        }
    }

    private static boolean isInscricaoEstadualSPValida(String i_inscricaoEstadual) throws Exception {
        int soma = 0;
        int posicao = 0;
        int peso[] = {};
        int resto = 0;
        int digito = 0;

        i_inscricaoEstadual = formatNumber(i_inscricaoEstadual, 12);

        for (int i = 1; i < 3; i++) {
            switch (i) {
                case 1:
                    peso = new int[]{1, 3, 4, 5, 6, 7, 8, 10};
                    posicao = 9;
                    break;

                case 2:
                    peso = new int[]{3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2};
                    posicao = 12;
                    soma = 0;
                    break;
            }

            for (int j = 1; j <= peso.length; j++) {
                soma += Integer.parseInt(i_inscricaoEstadual.substring(j - 1, j)) * peso[j - 1];
            }

            digito = soma % 11;

            if (!String.valueOf(digito).endsWith(i_inscricaoEstadual.substring(posicao - 1, posicao))) {
                return false;
            }
        }

        return true;
    }

    public static boolean isChaveNFEValida(String i_chaveNfe) {
        if (i_chaveNfe.length() != 44) {
            return false;
        }

        int peso[] = {4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};

        int soma = 0;

        for (int i = 0; i < peso.length; i++) {
            soma += Integer.parseInt(i_chaveNfe.substring(i, i + 1)) * peso[i];
        }

        int digito = soma % 11;

        if (digito != 0 && digito != 1) {
            digito = 11 - digito;
        } else {
            digito = 0;
        }

        if (digito == Integer.parseInt(i_chaveNfe.substring(43, 44))) {
            return true;
        } else {
            return false;
        }
    }
}
